#include"Common.h"
//#include"SpanList.h"
#include"ObjectPool.h"
#include"PageMap.h"

#define  NPAGES 129 


//只有一个PageCache,所以也将其设置为单例模式
class PageCache{
public:
    static PageCache* GetInstance(){
        return &_sInst;
    }

    Span* NewSpan(size_t k);
    //通过对象找到对应span
    Span* MapObjectToSpan(void* obj);

    void ReleaseSpanToPageCache(Span*s);

    void InsertPageToSpan(void* obj,PAGE_ID kpage);

    std::mutex _pageMtx;
private:
    //PageCache():_pageMap(SystemAlloc){}
    PageCache(){}
    PageCache(const PageCache& p);
    const PageCache& operator=(const PageCache& p)=delete;
private:
    static PageCache _sInst;
    //我们用数组下标来管理span，坐标号为5，则此处的span管理了5页内存，
    SpanList _spanLists[NPAGES];
public:
    //使用基数树来进行映射
    TCMalloc_PageMap3<64 - PAGE_SHIFT> _pageMap;
    
    //通过页号来映射对应的span
    //std::unordered_map<PAGE_ID,Span*> _pageToSpan;

    //定长内存池负责创建sapn，因为在内存池里面使用new的话，与我们初衷相悖，然而创建一个span又是我们绕不开的
    ObjectPool<Span> _spanPool;
};